<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>私有变量</title>
	</head>
	<body>
		javaScript没有私有属性的概念，所有的对象属性都是公有的，》》不过却又一个私有变量的概念。
		在任何函数中定义的变量，都可以认为是私有变量，因为不能在函数外部访问这些变量。
	
	</body>
	<script>
/*	 //私有变量
	 	function box(){
			var age=100;//私有变量，外部无法访问
		}*/
		
		//而通过函数内部创建一个闭包，那么闭包通过自己的作用域链也可以访问这些变量而利用这一点，可以创建用于访问私有变量的公共方法。
		
		//构造函数
		function Box(){//构造函数可以大写（最好）
			this.age =120; //属性，公有的
			this.run =function(){  //方法，公有的
				return '运行中..';
			};
		}
		var box = new Box();
		alert(box.age);//120
		alert(box.run());//运行中..'
		
		//
		/* function BoxOne(){
			var age =123;   //私有的变量
			function run(){  //私有函数
				return 'BoxOne运行中..';  
			}
		}
		var box =new BoxOne();
		alert(box.age);//undefined  无法调用 */
		
		//修改:通过公共接口访问私有变量和方法
		
		function BoxOne(){
			var age =123;   //私有的变量
			function run(){  //私有函数
				return 'BoxOne运行中..';  
			}
			
			this.publicGo =function(){//对外可见的公共接口，特权方法
				return 'publicGo..'+age+run();
			}
			this.publicGoTwo =function(){
				return age;
			}
		}
		var box =new BoxOne();
		alert(box.publicGo());//publicGo..123BoxOne运行中..
		alert(box.publicGoTwo());//123
		
		
		//通过构造函数传参   访问私有变量方法
		function MyConstructor(value){
			var user = value;  //私有变量
			this.getUser =function(){ //这里每次调用都会开辟新的地址
				return user;
			};
			this.setUser =function(value){ //赋值
				user =value;
			}
		};
		var mycon = new MyConstructor('小芳');
		alert(mycon.getUser());//小芳
		mycon.setUser('阿狸');
		alert(mycon.getUser());//阿狸
		
		//使用静态变量来解决对象的方法在多次调用时，每次都创建。
	
	
	
	   //静态私有变量
	   //通过块级作用域（私有作用域）中定义私有变量或函数，同样可以创建对外公共的特权方法。
	   
	   
	   //
	   (function(){
	   	var myuser ='';//私有变量
	   //	function BoxStatic(){//错误：构造函数但在函数里写构造函数，不支持，因为私有作用域里的函数外部无法访问
	   	BoxStatic =function(value){  //全局构造函数:实现共享，但是还是会开辟空间
	   		myuser =value;
	   		this.getUser=function(){    
	   			return myuser;
	   		}
	   	};
	   	
	   })();
	  var myuserone = new BoxStatic('小红');
		alert(myuserone.getUser()); //小红
		var myuserTwo = new BoxStatic('小名');//共享了数据
		alert(myuserone.getUser());//小明
		
		//使用原型
		
		 (function(){
	   	var myuser ='';//私有变量
	   	BoxStatic1 =function(value){//全局构造函数
	   		myuser =value;
	   		}
	   	//原型实现方式  //共享了数据
	   	BoxStatic1.prototype.getUser =function(){
	   		return myuser;
	   	};
	   	BoxStatic1.prototype.setUser=function(value){
	   		myuser = value;
	   	};
	   })();
	    var b1 = new BoxStatic1('qaq');
		alert(b1.getUser()); //qaq
		var b2 = new BoxStatic1('o.o');
		alert(b1.getUser());//o.o
		b2.setUser('t.t');
		alert(b1.getUser());//t.t
	   
	   
	   //模块模式
	   //对象的字面量方式就是采用模块模式来创建
	   
	  
	   
	</script>
</html>
